package datasource

import (
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

//type Model struct {
//	ID        uint    `gorm:"primary_key;comment:'数据id''" json:"id" req:"-"`
//	CreatedAt string  `json:"created_at" gorm:"type:varchar(30);comment:'创建时间'" req:"-"`
//	UpdatedAt string  `json:"updated_at" gorm:"type:varchar(30);comment:'修改时间'" req:"-"`
//	DeletedAt *string `gorm:"type:varchar(30);default:null;comment:'删除时间'" json:"deleted_at" resp:"-" req:"-"`
//}

// Logger :
type Logger interface {
	Infof(format string, a ...interface{})
	Warnf(format string, a ...interface{})
	Errorf(format string, a ...interface{})
}

//
//// 初始化数据库
//func EnableMysql(conf module.MysqlConf) (*gorm.DB, error) {
//	var err error
//	var tdb *gorm.DB
//	dsn, err := getMysqlDsn(conf)
//	if err != nil {
//		return nil, err
//	}
//	tdb, err = gorm.Open("mysql", dsn)
//	/*tdb, err = gorm.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
//	conf.Username,
//	conf.Password,
//	conf.Address,
//	conf.DbName))*/
//
//	if err != nil {
//		return nil, err
//	}
//	if conf.Prefix != "" {
//		gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string {
//			return conf.Prefix + defaultTableName
//		}
//	}
//
//	tdb.LogMode(conf.IsLogMode)
//	tdb.SingularTable(conf.IsSingular)
//	// 注册钩子函数
//	if !conf.NotReplace {
//		tdb.Callback().Create().Replace("gorm:update_time_stamp", updateTimeStampForCreateCallback)
//		tdb.Callback().Update().Replace("gorm:update_time_stamp", updateTimeStampForUpdateCallback)
//		tdb.Callback().Delete().Replace("gorm:delete", deleteCallback)
//	}
//
//	tdb.DB().SetMaxIdleConns(conf.MaxIdleConns)
//	tdb.DB().SetMaxOpenConns(conf.MaxOpenConns)
//	tdb.DB().SetConnMaxLifetime(time.Duration(conf.ConnMaxLifetime * int64(time.Millisecond)))
//	return tdb, nil
//}
//
//// // 注册新建钩子在持久化之前
//func updateTimeStampForCreateCallback(scope *gorm.Scope) {
//	if !scope.HasError() {
//		nowTime := time.Now().Format("2006-01-02 15:04:05")
//		if createTimeField, ok := scope.FieldByName("CreatedAt"); ok {
//			if createTimeField.IsBlank {
//				createTimeField.Set(nowTime)
//			}
//		}
//		if modifyTimeField, ok := scope.FieldByName("UpdatedAt"); ok {
//			if modifyTimeField.IsBlank {
//				modifyTimeField.Set(nowTime)
//			}
//		}
//	}
//}
//
//// 注册更新钩子在持久化之前
//func updateTimeStampForUpdateCallback(scope *gorm.Scope) {
//	if _, ok := scope.Get("gorm:update_column"); !ok {
//		scope.SetColumn("UpdatedAt", time.Now().Format("2006-01-02 15:04:05"))
//	}
//}
//
//// 注册删除钩子在删除之前
//func deleteCallback(scope *gorm.Scope) {
//	if !scope.HasError() {
//		var extraOption string
//		if str, ok := scope.Get("gorm:delete_option"); ok {
//			extraOption = fmt.Sprint(str)
//		}
//
//		deletedOnField, hasDeletedOnField := scope.FieldByName("DeletedAt")
//
//		if !scope.Search.Unscoped && hasDeletedOnField {
//			scope.Raw(fmt.Sprintf(
//				"UPDATE %v SET %v=%v %v %v",
//				scope.QuotedTableName(),
//				scope.Quote(deletedOnField.DBName),
//				scope.AddToVars(time.Now().Format("2006-01-02 15:04:05")),
//				addExtraSpaceIfExist(scope.CombinedConditionSql()),
//				addExtraSpaceIfExist(extraOption),
//			)).Exec()
//		} else {
//			scope.Raw(fmt.Sprintf(
//				"DELETE FROM %v%v%v",
//				scope.QuotedTableName(),
//				addExtraSpaceIfExist(scope.CombinedConditionSql()),
//				addExtraSpaceIfExist(extraOption),
//			)).Exec()
//		}
//	}
//}
//func addExtraSpaceIfExist(str string) string {
//	if str != "" {
//		return " " + str
//	}
//	return ""
//}
